package cn.iocoder.yudao.module.vos.job.component;

import java.io.File;
import java.lang.reflect.Field;

/**
 * 纯 main 函数执行：
 * 2）调用 AiNlpClient.transcribeAudioText 转写
 * 3）调用 AiNlpClient.processTxtWithGpt 做语义抽取
 *
 * 用法：在 IDEA 里右键 main → Run 即可。
 */
public class AiNlpClientStandaloneTest {

    // Win10 录音目录
    private static final String AUDIO_DIR = "D:\\\\upload\\\\luyin";

    public static void main(String[] args) throws Exception {
        // 1. 手动 new 出 AiNlpClient（不走 Spring）
        AiNlpClient client = new AiNlpClient();

        // 2. 给 openaiBaseUrl / apiKey 赋值（用反射注入 @Value 那两个字段）
        //    baseUrl 看你实际配置：如果使用官方接口就是 https://api.openai.com/v1
        String baseUrl = System.getenv().getOrDefault("OPENAI_BASE_URL", "http://47.236.36.107/v1");

        //    apiKey 建议从环境变量拿；没有的话你可以直接在下面填死
        String apiKey = System.getenv("OPENAI_API_KEY");
        if (apiKey == null || apiKey.trim().isEmpty()) {
            // TODO 把这里改成你自己的 key，或者改成从配置文件读取
            apiKey = "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";
        }

        injectField(client, "openaiBaseUrl", baseUrl);
        injectField(client, "apiKey", apiKey);

        // 3. 遍历目录里的音频文件
        File dir = new File(AUDIO_DIR);
        if (!dir.isDirectory()) {
            System.out.println("目录不存在或不是文件夹: " + AUDIO_DIR);
            return;
        }

        File[] audioFiles = dir.listFiles((d, name) -> {
            String lower = name.toLowerCase();
            return lower.endsWith(".mp3")
                    || lower.endsWith(".wav")
                    || lower.endsWith(".m4a")
                    || lower.endsWith(".aac")
                    || lower.endsWith(".flac");
        });

        if (audioFiles == null || audioFiles.length == 0) {
            System.out.println("目录下没有音频文件: " + AUDIO_DIR);
            return;
        }

        // 4. 逐个文件转写 + 语义解析
        for (File audio : audioFiles) {
            try {
                System.out.println("======================================");
                System.out.println("开始处理文件: " + audio.getName());
                System.out.println("路径: " + audio.getAbsolutePath());

                // 4.1 whisper 转写
                String transcript = client.transcribeAudioText(audio.getAbsolutePath());
                System.out.println("【转写结果】:");
                System.out.println(transcript);

                // 4.2 GPT 语义抽取
                String json = client.processTxtWithGpt(transcript);
                System.out.println("【语义抽取 JSON】:");
                System.out.println(json);

                System.out.println("处理完成: " + audio.getName());
                System.out.println("======================================\n");
            } catch (Exception e) {
                System.err.println("处理文件失败: " + audio.getName());
                e.printStackTrace();
            }
        }
    }

    /**
     * 用反射给 AiNlpClient 的私有字段赋值
     */
    private static void injectField(Object target, String fieldName, Object value) throws Exception {
        Field field = target.getClass().getDeclaredField(fieldName);
        field.setAccessible(true);
        field.set(target, value);
    }
}
